// src/utils/api.js
// 保持为空，因为使用了Vite代理
const API_BASE_URL = "";

/**
 * 通用API请求封装函数
 * @param {string} url - 请求的URL路径
 * @param {Object} options - 请求选项配置
 * @returns {Promise} 返回解析后的JSON数据
 */
export async function apiFetch(url, options = {}) {
    // 设置默认选项，包含凭证信息用于Cookie传输
    const defaultOptions = {
        credentials: "include", // 确保跨域请求时携带Cookie
        ...options,
    };

    // 如果是POST/PUT请求且未设置请求头，默认设置Content-Type为application/json
    if ((defaultOptions.method === "POST" || defaultOptions.method === "PUT") && !defaultOptions.headers) {
        defaultOptions.headers = {
            "Content-Type": "application/json",
        };
    }

    // 记录请求开始日志，包含请求URL、方法和配置选项
    console.log("API请求开始:", {
        url: API_BASE_URL + url, method: defaultOptions.method || "GET", options: defaultOptions
    });

    // 发起网络请求
    const response = await fetch(API_BASE_URL + url, defaultOptions);

    // 记录响应详情日志，包含状态码、重定向信息等
    console.log("API响应详情:", {
        url: url,
        status: response.status,
        statusText: response.statusText,
        redirected: response.redirected,
        headers: [...response.headers.entries()]
    });

    // 检查是否被重定向到登录页面（302状态码或浏览器自动重定向）
    if (response.redirected || response.status === 302) {
        // 记录重定向警告信息，包含原始URL和重定向目标
        console.warn("请求被重定向:", {
            originalUrl: url, redirectUrl: response.url, status: response.status
        });

        // 对于检查登录状态的请求，直接处理为未认证状态
        if (url === "/api/users/info") {
            console.log("检查登录状态请求被重定向，标记为未认证");
            throw new Error("NOT_AUTHENTICATED");
        } else {
            // 其他请求的重定向处理
            console.log("其他请求被重定向到登录页面");
            // 改为抛出错误而不是直接跳转
            throw new Error("Redirected to login page");
        }
    }


    // 检查是否未认证 (401或403都表示未认证)
    if (response.status === 401 || response.status === 403) {
        // 记录未认证警告信息
        console.warn("请求未认证:", {
            url: url, status: response.status
        });

        // 只有在非检查登录状态的请求中才自动重定向
        // 检查登录状态的请求应该由调用方处理认证失败情况
        if (url !== "/api/users/info") {
            console.log("非检查登录状态请求未认证，抛出未授权错误");
            throw new Error("Unauthorized");
        }
    }

    // 处理404错误
    if (response.status === 404) {
        console.error("API not found:", url);
        throw new Error("请求的接口不存在");
    }

    // 检查响应是否为JSON格式
    const contentType = response.headers.get("content-type");
    if (!contentType || !contentType.includes("application/json")) {
        // 记录非JSON响应警告
        console.warn("响应不是JSON格式:", {
            url: url, contentType: contentType
        });

        // 只有在非检查登录状态的请求中才自动重定向到登录页面
        if (url !== "/api/users/info") {
            console.log("非检查登录状态请求返回非JSON响应，重定向到登录页面");
            window.location.href = "/login";
            throw new Error("Non-JSON response");
        }
    }

    // 解析并返回JSON数据
    const jsonData = response.json();
    console.log("API请求完成，返回数据:", {
        url: url, data: jsonData
    });

    return jsonData;
}

// 登录相关API
/**
 * 用户登录接口
 * @param {Object} credentials - 登录凭证，包含用户名和密码
 * @returns {Promise} 登录结果Promise
 */
export function login(credentials) {
    return apiFetch("/api/auth/login", {
        method: "POST", body: JSON.stringify(credentials),
    });
}

/**
 * 用户登出接口
 * @returns {Promise} 登出结果Promise
 */
export function logout() {
    return apiFetch("/api/auth/logout", {
        method: "GET",
    });
}

/**
 * 检查登录状态接口
 * @returns {Promise} 登录状态Promise
 */
export function checkLoginStatus() {
    return apiFetch("/api/users/info");
}

// 用户相关API
/**
 * 获取当前用户信息接口
 * @returns {Promise} 用户信息Promise
 */
export function getUserInfo() {
    return apiFetch("/api/users/info");
}

/**
 * 获取所有用户列表接口
 * @returns {Promise} 用户列表Promise
 */
export function getAllUsers() {
    return apiFetch("/api/users/findAll");
}

/**
 * 根据ID获取用户信息接口
 * @param {Object} userData - 包含用户ID的数据对象
 * @returns {Promise} 用户信息Promise
 */
export function getUserById(userData) {
    return apiFetch("/api/users/getUserById", {
        method: "POST", body: JSON.stringify(userData),
    });
}

/**
 * 添加用户接口
 * @param {Object} userData - 用户数据对象
 * @returns {Promise} 添加结果Promise
 */
export function addUser(userData) {
    return apiFetch("/api/users/addUser", {
        method: "POST", body: JSON.stringify(userData),
    });
}

/**
 * 更新用户信息接口
 * @param {Object} userData - 更新后的用户数据对象
 * @returns {Promise} 更新结果Promise
 */
export function updateUserInfo(userData) {
    return apiFetch("/api/users/updateUser", {
        method: "POST", body: JSON.stringify(userData),
    });
}

/**
 * 删除用户接口
 * @param {Object} userData - 包含用户ID的删除数据对象
 * @returns {Promise} 删除结果Promise
 */
export function deleteUser(userData) {
    return apiFetch("/api/users/deleteUserById", {
        method: "POST", body: JSON.stringify(userData),
    });
}
